home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s44play / s44p101s.lzh / buffer.s < prev    next >
Text File  |  2000-01-23  |  5KB  |  241 lines

  1.     .include    doscall.mac
  2.     .include    iocscall.mac
  3.     .include    fefunc.h
  4.     .include    global.mac
  5.  
  6. ;----------------------------------------------------------------
  7. ;バッファを確保する
  8. ;>d0.l:0=確保できた,-1=確保できなかった
  9. ;>n-flag:mi=確保できなかった
  10.     .text
  11.     .align    4,$2048
  12. malloc_buffer::
  13.     movem.l    d1-d2/a0-a3,-(sp)
  14.  
  15.     move.l    param_bufunt,bufunt
  16.     bpl    10f
  17. ;バッファサイズの指定がない
  18.     move.l    #DEFAULT_BUFUNT,bufunt
  19.     tst.b    onmem_flag
  20.     beq    10f            ;-onmemでなければ標準サイズ
  21. malloc_buffer_onmem:
  22.     moveq.l    #0,d1
  23.     tst.b    himem_flag
  24.     beq    @f
  25.     bsr    himem_exist
  26.     bmi    @f
  27.     moveq.l    #3,d1
  28.     moveq.l    #$F8,d0
  29.     trap    #15
  30. @@:    move.l    #$00FFFFFF,-(sp)
  31.     DOS    _MALLOC
  32.     addq.l    #4,sp
  33.     and.l    #$00FFFFFF,d0
  34.     cmp.l    d1,d0
  35.     bcc    @f
  36.     move.l    d1,d0
  37. @@:
  38. ;<d0.l:1度に確保できる最大サイズ
  39.     tst.b    onmem_flag
  40.     bne    1f
  41.     sub.l    #-(16+16+16+16),d0
  42.     bra    2f
  43. 1:    sub.l    #-(16+16),d0
  44. 2:    move.l    #BUFSIZ_UNIT,d1
  45.     FPACK    __UDIV
  46.     move.l    d0,bufunt
  47.     move.l    d0,param_bufunt
  48. 10:
  49.  
  50.     move.l    bufunt,d0
  51.     move.l    #BUFSIZ_UNIT,d1        ;BUFSIZ_UNIT>65535なのでmulu.wは不可
  52.     FPACK    __UMUL
  53.     movea.l    d0,a3
  54.     tst.b    onmem_flag
  55.     bne    1f
  56.     lea.l    (16+16+16+16,a3),a2    ;アロケートするサイズ
  57.     bra    2f
  58. 1:    lea.l    (16+16,a3),a2        ;アロケートするサイズ
  59. 2:    move.l    a2,bufsiz
  60. ;<a2.l:アロケートするサイズ
  61. ;<a3.l:バッファとして使用するサイズ
  62.  
  63.     tst.b    himem_flag
  64.     beq    1f            ;ハイメモリを使わない
  65.     bsr    himem_exist
  66.     bmi    1f            ;ハイメモリが使えない
  67. ;ハイメモリからアロケートする
  68.     move.l    a2,d2
  69.     moveq.l    #1,d1
  70.     moveq.l    #$F8,d0
  71.     trap    #15
  72.     tst.l    d0
  73.     bne    1f            ;アロケート失敗
  74.     move.l    a1,buftop        ;アロケートした領域の先頭
  75.     adda.l    a2,a1
  76.     move.l    a1,bufbtm        ;アロケートした領域の末尾
  77.     st.b    himem_allocated        ;ハイメモリからアロケートした
  78.     bra    2f
  79. ;普通にアロケートする
  80. 1:    move.l    a2,-(sp)
  81.     DOS    _MALLOC
  82.     addq.l    #4,sp
  83.     tst.l    d0
  84.     bpl    @f
  85. ;アロケートできなかった
  86.     tst.l    param_bufunt
  87.     bpl    80f            ;-b<n>の指定があるのでエラー
  88. ;-b<n>の指定がないときは確保できる最大のサイズを確保する
  89.     bra    malloc_buffer_onmem
  90. @@:    move.l    d0,buftop        ;アロケートした領域の先頭
  91.     add.l    a2,d0
  92.     move.l    d0,bufbtm        ;アロケートした領域の末尾
  93.     sf.b    himem_allocated        ;ハイメモリからアロケートしなかった
  94. 2:
  95.  
  96.     move.l    a3,d0
  97.     move.l    #BUFFRM_UNIT,d1
  98.     FPACK    __UDIV
  99. ;<d0.l:バッファとして使用するフレーム数
  100.     tst.b    onmem_flag
  101.     bne    1f
  102.     lsr.l    #2,d0
  103.     bra    2f
  104. 1:    lsr.l    #1,d0
  105. 2:    cmp.l    #65535,d0        ;1度に転送できるフレーム数は65535まで
  106.     bls    @f
  107.     move.l    #65535,d0
  108. @@:    move.l    d0,buffrm
  109. ;<d0.l:1個のバッファに使用するフレーム数
  110.     move.l    #BUFFRM_UNIT,d1
  111.     FPACK    __UMUL
  112.     move.l    d0,bufhsiz
  113. ;<d0.l:1個のバッファのサイズ
  114.     movea.l    buftop,a0
  115.     move.l    a0,buf0top
  116.     adda.l    d0,a0
  117.     move.l    a0,buf0btm
  118.     lea.l    (16,a0),a0        ;ダミー
  119.     move.l    a0,buf1top
  120.     adda.l    d0,a0
  121.     move.l    a0,buf1btm
  122.     tst.b    onmem_flag
  123.     bne    1f
  124.     lea.l    (16,a0),a0        ;ダミー
  125.     move.l    a0,buf2top
  126.     adda.l    d0,a0
  127.     move.l    a0,buf2btm
  128.     lea.l    (16,a0),a0        ;ダミー
  129.     move.l    a0,buf3top
  130.     adda.l    d0,a0
  131.     move.l    a0,buf3btm
  132.     bra    2f
  133. 1:    clr.l    buf2top            ;onmemのときはbuf2,buf3を確保しない
  134.     clr.l    buf2btm
  135.     clr.l    buf3top
  136.     clr.l    buf3btm
  137. 2:
  138.  
  139.     tst.b    silent_flag
  140.     bne    @f
  141.     lea.l    (m_allocated1,pc),a0
  142.     bsr    eprint
  143.     move.l    bufsiz,d0
  144.     lsr.l    #8,d0
  145.     lsr.l    #2,d0
  146.     bsr    utos_eprint
  147.     lea.l    (m_allocated2,pc),a0
  148.     bsr    eprintcrlf
  149. @@:
  150.  
  151. 98:    moveq.l    #0,d0
  152.  
  153. 99:    movem.l    (sp)+,d1-d2/a0-a3
  154.     rts
  155.  
  156. 80:    move.w    #EXIT_MEMORY_ERROR,exit_code
  157.     lea.l    (m_memory_error,pc),a0
  158. 89:    bsr    eaprintcrlf
  159.     moveq.l    #-1,d0
  160.     bra    99b
  161.  
  162. m_allocated1:        .dc.b    'PCM バッファを ',0
  163. m_allocated2:        .dc.b    'KB 確保しました ',0
  164. m_memory_error:        .dc.b    'メモリが確保できません',0
  165.     .even
  166.  
  167.     .data
  168.     .align    4
  169. buftop:        .dc.l    0
  170. bufbtm:        .dc.l    0
  171. stpfrm::    .dc.l    DEFAULT_BUFFRM
  172. stpsiz::    .dc.l    DEFAULT_BUFSIZ
  173.  
  174.     .bss
  175.     .align    4
  176. bufunt:        .ds.l    1
  177. bufsiz:        .ds.l    1
  178. buffrm::    .ds.l    1
  179. bufhsiz::    .ds.l    1
  180. buf0top::    .ds.l    1
  181. buf0btm:    .ds.l    1
  182. buf1top::    .ds.l    1
  183. buf1btm:    .ds.l    1
  184. buf2top::    .ds.l    1
  185. buf2btm:    .ds.l    1
  186. buf3top::    .ds.l    1
  187. buf3btm:    .ds.l    1
  188.  
  189. himem_allocated:    .dc.b    0
  190.  
  191. ;----------------------------------------------------------------
  192. ;ハイメモリが使えるかどうか調べる
  193. ;>d0.l:0=使える,-1=使えない
  194. ;>n-flag:mi=使えない
  195.     .text
  196.     .align    4,$2048
  197. himem_exist:
  198.     move.l    a1,-(sp)
  199.     move.w    #$01F8,-(sp)
  200.     DOS    _INTVCG
  201.     addq.l    #2,sp
  202.     movea.l    d0,a1
  203.     subq.l    #6,a1
  204.     IOCS    _B_LPEEK
  205.     cmp.l    #'HIME',d0
  206.     bne    90f            ;ハイメモリが使えない
  207.     IOCS    _B_WPEEK
  208.     cmp.w    #'M'*$0100,d0
  209.     bne    90f            ;ハイメモリが使えない
  210.     moveq.l    #0,d0
  211. 99:    movea.l    (sp)+,a1
  212.     rts
  213.  
  214. 90:    moveq.l    #-1,d0
  215.     bra    99b
  216.  
  217. ;----------------------------------------------------------------
  218. ;バッファを開放する
  219.     .text
  220.     .align    4,$2048
  221. free_buffer::
  222.     move.l    buftop,d0
  223.     beq    9f
  224.     tst.b    himem_allocated
  225.     beq    1f
  226.     move.l    d0,d2
  227.     moveq.l    #2,d1
  228.     moveq.l    #$F8,d0
  229.     trap    #15
  230.     bra    2f
  231.  
  232. 1:    move.l    d0,-(sp)
  233.     DOS    _MFREE
  234.     addq.l    #4,sp
  235. 2:    clr.l    buftop
  236.     clr.l    bufbtm
  237.     sf.b    himem_allocated
  238. 9:    moveq.l    #0,d0
  239.     rts
  240.  
  241.